package Thread.Lock;

import java.util.concurrent.locks.ReentrantLock;

/*
      卖票案例出现了线程安全问题
        卖出了不存在和重复的票

    解决线程安全问题的一种方案：使用lock锁
    java.util.concurrent.locks.lock接口
    lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁的操作
    lock接口的方法：
        void lock()     获取锁
        void unlock()   释放锁
    java.util.concurrent.locks.Reentrantlock implements lock接口

    使用步骤
        1、在成员位置创建一个Reentrantlock对象
        2、在可能会出现安全问题的代码前调用lock接口中的lock获取锁
        3、在可能会出现安全问题的代码后面调用lock接口中的unlock释放锁
*/
public class Runnable01 implements Runnable {
    //指定票数为100
    private int tickets = 100;
    ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {

        //定义一个同步方法
        while (true) {
            lock.lock();
            if (tickets > 0) {
                try {
                    Thread.sleep(10);
                    System.out.println("正在卖地第" + tickets + "张票");
                    tickets--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }
        }
    }
}
